package fr.bugtracker.commun.outils;

import java.util.Date;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;

import org.springframework.security.authentication.encoding.ShaPasswordEncoder;
import org.springframework.security.core.session.SessionInformation;
import org.springframework.security.core.session.SessionRegistry;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.sun.xml.rpc.processor.modeler.j2ee.xml.string;

import fr.bugtracker.entity.technique.Utilisateur;

/**
 *
 * @author lparrot
 */
public abstract class UtilsSecurity {


	/**
	 * Constructeur de la classe <code>UtilsSecurity</code>.
	 */
	private UtilsSecurity() {
	}

	/**
	 * Récupère le fr.bugtracker.bean typé grace au contexte de Spring
	 * @param pBean {@link String} le nom du fr.bugtracker.bean dans le context
	 * @param pClass {@link Class} la classe du fr.bugtracker.bean
	 * @return T le fr.bugtracker.bean typé
	 */
	private static <T> T getBean(String pBean, Class<T> pClass) {
		ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
		WebApplicationContext springContext = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
		return (T) springContext.getBean(pBean);
	}

	/**
	 * Chiffre le mot de passe d'un utilisateur.
	 * @param pSalt {@link Date} la date a utiliser
	 * @param pPassword {@link String} le mot de passe à chiffrer.
	 * @return {@link String} Le mot de passe chiffré.
	 */
	public static String chiffrerMotdepasse(Object pSalt, String pPassword) {
		return new ShaPasswordEncoder().encodePassword(pPassword, pSalt);
	}

	/**
	 * Retourne tous les utilisateurs connectés
	 * @return {@link List}< {@link Object} >
	 */
	public static List<Object> getAllPrincipals() {
		return getBean("sessionRegistry", SessionRegistry.class).getAllPrincipals();
	}

	/**
	 * Récupère toutes les informations sur les sessions d'un utilisateur
	 * @param pUtilisateur {@link Utilisateur}
	 * @return {@link List}< {@link SessionInformation} >
	 */
	public static List<SessionInformation> getAllSessions(Utilisateur pUtilisateur) {
		return getBean("sessionRegistry", SessionRegistry.class).getAllSessions(pUtilisateur, false);
	}

	/**
	 * Récupère l'information sur la session par rapport a l'id de la session http
	 * @param pIdSession {@link string} l'id de la session http
	 * @return {@link SessionInformation}
	 */
	public static SessionInformation getSessionInformation(String pIdSession) {
		return getBean("sessionRegistry", SessionRegistry.class).getSessionInformation(pIdSession);
	}

}
